﻿<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="cmd.css" rel="stylesheet" type="text/css">
<title>内存使用简析</title>
</head>

<body>
<blockquote>
  <blockquote>
    <blockquote>
      <blockquote>
        <h2>GRUB4DOS  内存使用简析</h2>
      </blockquote>
    </blockquote>
  </blockquote>
</blockquote>
<p><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span>grub4dos中有两个比较特别的设备：</p>
<blockquote>
  <blockquote>
    <p><span class="Options">(md) 、(rd)</span></p>
  </blockquote>
</blockquote>
<p class="style1">(md) 设备访问内存是从物理地址 0 开始，而 (rd) 可以访问起始于任何基地址的内存。<br>
随机存贮器的(rd)基址与长度可以通过 map 命令指定，详情可查看<a href="./GRUB4DOS5命令索引.htm#map">命令索引 map 命令</a>部分，也可使用 &quot;help map&quot; 命令。</p>
<blockquote>
  <p class="style1">如定义(rd)基地址及长度：</p>
  <blockquote>
    <p><span class="cmd">map --rd-base=0x40000</span> (从绝对内存地址256KB开始）</p>
    <p><span class="cmd">map --rd-size=0x800</span> (长度为2KB)</p>
    <p>#注意：本处使用的的是绝对算法，将16进制转换为10进制即可。</p>
  </blockquote>
  <p>或：</p>
  <blockquote>
    <p><span class="cmd">cat (md)4+8</span></p>
    <p>#注意：本处使用的是扇区数量表示法，将16进制转换为10进制后得到的是扇区数量，非最终结果。</p>
    <p>#表示查看从内存地址4*0x200字节开始的8个扇区（从2KB处起，长度为4KB的区域）</p>
    <p>若想使用绝对算法查看可使用下面办法：</p>
    <p><span class="cmd">map --rd-base=0x800<br>
      map --rd-size=0x1000<br>
      cat (rd)+1<span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Notes">&nbsp;&nbsp;&nbsp;</span></span></p>
    <p>#即令rd设备从内存2K（0x800）开始，长度为4K（0x1000），然后查看整个rd设备。</p>
  </blockquote>
</blockquote>
<p class="style1">这样就可以在编写复杂菜单时将临时文件写入内存中，chenall 的 CSPE 和 paeudo 的 0PE 是这方面的经典作品，他们的菜单文件包含大量内存应用示范。</p>
<blockquote>
  <p>在grub4dos环境中，以下两块内存可以放心使用：</p>
  <p>1、<span class="bat">0x60000开始处1KB（即内存384KB开始的长度为1KB的区域）</span>，经常用于菜单或批处理临时使用。</p>
  <p>2、<span class="bat">0x40000－0x44FFF（即内存256KB至275KB之间，长度为20KB）</span>也是可以使用的（这一段是最常使用的，且空间较大）。<br>
  <span class="style1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="Options">其它16MB以内的内存最好不要随意使用</span><span class="style1">，很多有特殊的用途。<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保守一些的话，</span><span class="Options">尽量使用32M以上的内存空间</span><span class="style1">做临时文件用。</span></p>
  <blockquote>
    <p>32M绝对地址：0x2000000 ；</p>
    <p>32M扇区表示法：（md)0x10000+?（问号是数值多少，就代表从32M处开始的多少个扇区）</p>
  </blockquote>
</blockquote>
<p><span class="style1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于地址、空间的计算，不算复杂，但要求基本的计算机基础（最起码要会16进制数据转换为10进制或2进制，再多说一句，二进制0b开头，八进制0o开头，十进制0d开头或者不用开头声明 ，十六进制0x开头）。</span></p>
<p>1、绝对算法示例：</p>
<blockquote>
  <p>以0x60000为例，</p>
  <blockquote>
    <p><span class="cmd">0x60000=393216B=(/1024)=384KB</span></p>
  </blockquote>
</blockquote>
  <p>2、扇区数量表示法示例：  </p>
<blockquote>
  <p>以(md)0x3000+2为例，</p>
  <blockquote>
    <p><span class="cmd">0x3000×0x200=12288×512B=6291456B=(/1024)=6144KB=(/1024)=6M</span></p>
    <p>#即从内存6MB处开始，长度为1K的区域。</p>
  </blockquote>
  <p>以(md)0x60000为例，</p>
  <blockquote>
    <p><span class="cmd">0x60000=393216×512B=201326592B=(/1024)=196608KB=(/1024)=192M</span></p>
  </blockquote>
  <p class="style1">其实还有个简单的算法，</p>
  <blockquote>
    <p class="style1">0x800*(0x200)=0x100000=1M<br>
      0x1000*(0x200)=2M<br>
      0x60000*(0x200)=0x60*2m=192M</p>
    <p class="style1">知道这个关系后，使用16进制进行计算就能轻松得到是1MB的几倍，即可得到结果。</p>
  </blockquote>
</blockquote>
</blockquote>
<p><span class="Notes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong>可以参见一个比较简单的实例来帮助大家理解，<a href="./GRUB4DOS10-1内存变量实例菜单.htm">点此查看实例</a>。</strong></p>
</body>
</html>
